home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
BCI NET
/
BCI NET Dec 94.iso
/
archives
/
programming
/
source
/
retinasource.lha
/
RBO_SCode.lha
/
Include
/
promizer-replay.S
< prev
next >
Wrap
Text File
|
1993-05-03
|
23KB
|
1,159 lines
section "player",code_p
;------------------------------------------------------------------------------
; TEST PLAYING
;------------------------------------------------------------------------------
testplay
bsr.w mt_init
lea $dff000,a6
move.w $1c(a6),d0
move.w #$3fff,$9a(a6) ;kill interupts
waitbutt
cmp.b #-1,6(a6)
bne.b waitbutt
movem.l d0/a6,-(a7)
bsr.w mt_music
movem.l (a7)+,d0/a6
btst #6,$bfe001
bne.b waitbutt
move.w #$7fff,$9a(a6)
bset #15,d0
move.w d0,$9a(a6)
bra.w mt_end
;------------------------------------------------------------------------------
; PROMIZER PLAYER V0.1a ... MAY 1992
;------------------------------------------------------------------------------
; coded by MC68000 of TECH
; Frank Hülsmann
; Timmerscheidtstr. 14
; 4400 Münster/Germany
;------------------------------------------------------------------------------
;
; MODIFY 'mt_maxvol' (0-64 ... size : byte) TO SET MAXIMUM ABSOLUT VOLUME !!!
;
; THIS PLAYER WORKS WITH FINETUNED SAMPLES BY USING A MINIMUM OF RASTER TIME !!
; THE CODE BASED ON THE PROTRACKER V1.1b REPLAYER BY ZAP/AMIGA FREELANCERS, BUT
; IT'S MAX.400% FASTER AND FULLY PC-RELOCATIBLE ...
;
;------------------------------------------------------------------------------
mt_level6=1 ;1=level 6 interupt on (faster dmareg. init)
mt_dmawaiter=3 ;no.of rasterlines waiting for dma
; INIT_PLAYING ----------------------------------------------------------------
mt_init movem.l d0-a6,-(a7)
lea mt_pm(pc),a5
move.l mt_dataptr(pc),a0
lea 762(a0),a1 ;patternlenght
move.l (a1)+,d0
add.l d0,a1 ;samplestarts
lea mt_samplestarts(pc),a2
moveq #30,d1
mt_samploop
moveq #0,d0
move.w (a0),d0 ;samplelength in words
add.l d0,d0 ;samplelength in bytes
move.l a1,(a2)+ ;save sample adress
add.l d0,a1 ;next sample
addq.l #8,a0 ;next sample info
dbf d1,mt_samploop
or.b #2,$bfe001 ;filter off
move.b #6,mt_speed-mt_pm(a5)
clr.b mt_counter-mt_pm(a5)
clr.w mt_songpos-mt_pm(a5)
clr.w mt_patternpos-mt_pm(a5)
move.l $78.w,mt_oldirq-mt_pm(a5) ;save old_irq
lea $dff096,a0
clr.w $a8-$96(a0)
clr.w $b8-$96(a0)
clr.w $c8-$96(a0)
clr.w $d8-$96(a0) ;volume voice 1-4 = 0
moveq #$f,d0
move.w d0,(a0) ;no sound_dma
; CREATE PERIOD MULTAB (FOR FASTER FINE_TUNING)
moveq #15,d7
moveq #0,d0
moveq #72,d1
mt_mulloop2
move.w d0,(a5)+
add.w d1,d0
dbf d7,mt_mulloop2
; CALCULATE RELATIVE JUMP ADRESSES IN JUMPTABS (FOR PC-COMPATIBLE CODE !!!)
lea mt_init(pc),a0
move.l a0,d0
lea mt_jumptab1(pc),a0
lea mt_jumptab2(pc),a1
lea mt_jumptab3(pc),a2
lea mt_jumptab4(pc),a3
moveq #15,d1
mt_jumpcalcloop
add.l d0,(a0)+
add.l d0,(a1)+
add.l d0,(a2)+
add.l d0,(a3)+
dbf d1,mt_jumpcalcloop
if mt_level6=1
lea mt_irqpointer(pc),a0
add.l d0,(a0)
endc
movem.l (a7)+,d0-a6
rts
; END_PLAYING -----------------------------------------------------------------
mt_end movem.l d0/a0,-(a7)
move.l mt_oldirq(pc),$78.w
lea $dff096,a0
clr.w $a8-$96(a0)
clr.w $b8-$96(a0)
clr.w $c8-$96(a0)
clr.w $d8-$96(a0)
moveq #$f,d0
move.w d0,(a0)
movem.l (a7)+,d0/a0
rts
; SOUND_PLAYER ---------------------------------------------------------------
; kills d0-d7/a0-a6 !!!!
mt_music
moveq #$f,d5 ;ander com_low
moveq #-16,d6 ;ander com
lea mt_pm(pc),a2
addq.b #1,mt_counter-mt_pm(a2)
move.b mt_counter-mt_pm(a2),d0
cmp.b mt_speed-mt_pm(a2),d0
blo.b mt_nonewallchannels
clr.b mt_counter-mt_pm(a2)
tst.b mt_pattdeltime2-mt_pm(a2)
beq.b mt_getnewnote
bsr.b mt_nonewallchannels
bra.w mt_dskip
mt_nonewallchannels
lea $dff0a0,a5
lea mt_chan1temp(pc),a6
bsr.w mt_checkefx
lea $10(a5),a5
lea 48(a6),a6
bsr.w mt_checkefx
lea $10(a5),a5
lea 48(a6),a6
bsr.w mt_checkefx
lea $10(a5),a5
lea 48(a6),a6
bsr.w mt_checkefx
bra.w mt_nonewposyet
mt_getnewnote
move.l mt_dataptr(pc),a0
move.l a0,a3 ;sample infos
lea 250(a0),a4 ;patterpositions
lea 766(a0),a0 ;patterndata
moveq #0,d1
move.w mt_songpos(pc),d0
move.l (a4,d0.w),d1
add.w mt_patternpos(pc),d1
clr.w mt_dmacontemp-mt_pm(a2)
lea $dff0a0,a5
lea mt_chan1temp(pc),a6
bsr.b mt_playvoice
lea $10(a5),a5
lea 48(a6),a6
bsr.b mt_playvoice
lea $10(a5),a5
lea 48(a6),a6
bsr.b mt_playvoice
lea $10(a5),a5
lea 48(a6),a6
bsr.b mt_playvoice
bra.w mt_setdma
mt_playvoice
tst.l (a6)
bne.b mt_plvskip
bsr.w mt_pernop
mt_plvskip
move.l (a0,d1.l),d2
eor.l d6,d2
move.l d2,(a6)
addq.l #4,d1
moveq #0,d2
move.l d2,d3
move.b 2(a6),d2
lsr.b #4,d2
move.b (a6),d0
and.b d6,d0
or.b d0,d2
beq.w mt_setregs
lea mt_samplestarts(pc),a1
subq.w #1,d2
lsl.w #2,d2
move.w d2,d4
add.w d4,d4
move.w (a3,d4.w),8(a6)
move.w (a3,d4.w),40(a6) ;sample lenght in words
move.l (a1,d2.w),4(a6) ;sample adress
moveq #0,d0
move.b 2(a3,d4.w),d0
move.b d0,18(a6) ;set finetune number
add.w d0,d0
move.w (a2,d0.w),d0
lea mt_periodtable(pc),a4
add.l d0,a4
move.l a4,44(a6) ;save periodtable
move.b 3(a3,d4.w),d0 ;sample volume
cmp.b mt_maxvol(pc),d0
bls.b mt_nv
move.b mt_maxvol(pc),d0 ;cut volume -> no relative
mt_nv ;calculation here ...
move.b d0,19(a6)
move.w 4(a3,d4.w),d3 ;get repeat
beq.b mt_noloop
move.l 4(a6),d2 ;get start
add.w d3,d3
add.l d3,d2 ;add repeat
move.l d2,10(a6)
move.l d2,36(a6)
move.w 4(a3,d4.w),d0 ;get repeat
add.w 6(a3,d4.w),d0 ;add replen
move.w d0,8(a6)
move.w 6(a3,d4.w),14(a6) ;save replen
move.b 19(a6),9(a5) ;init volume
bra.b mt_setregs
mt_noloop
move.l 4(a6),d2
add.l d3,d2
move.l d2,10(a6)
move.l d2,36(a6)
move.w 6(a3,d4.w),14(a6) ;save replen
move.b 19(a6),9(a5)
mt_setregs
move.w (a6),d0
and.w #$0fff,d0
beq.w mt_checkmoreefx ;if no note
move.w 2(a6),d0
and.w #$0ff0,d0
cmp.w #$0e50,d0
beq.b mt_dosetfinetune
moveq #0,d0
move.b 2(a6),d0
and.b d5,d0
lsl.b #2,d0
move.l mt_jumptab3(pc,d0.w),a4
jmp (a4)
mt_jumptab3
dcb.l 3,mt_setperiod-mt_init
dc.l mt_chktoneporta-mt_init,mt_setperiod-mt_init
dc.l mt_chktoneporta-mt_init
dcb.l 3,mt_setperiod-mt_init
dc.l mt_moreplusperiod-mt_init
dcb.l 7,mt_setperiod-mt_init
mt_moreplusperiod
bsr.w mt_checkmoreefx
bra.b mt_setperiod
mt_dosetfinetune
bsr.w mt_setfinetune
bra.b mt_setperiod
mt_chktoneporta
bsr.w mt_settoneporta
bra.w mt_checkmoreefx
mt_setperiod
move.w (a6),d2
and.w #$0fff,d2 ; period 'ausanden'
move.w d2,16(a6) ; set normal period
move.w 2(a6),d0
and.w #$0ff0,d0
cmp.w #$0ed0,d0 ; notedelay
beq.w mt_checkmoreefx
move.w 20(a6),$dff096
btst #2,30(a6)
bne.b mt_vibnoc
clr.b 27(a6)
mt_vibnoc
btst #6,30(a6)
bne.b mt_trenoc
clr.b 29(a6)
mt_trenoc
move.l 4(a6),(a5) ; init start
move.w 8(a6),4(a5) ; init length
move.w 16(a6),6(a5) ; init period
move.w 20(a6),d0
or.w d0,mt_dmacontemp-mt_pm(a2)
bra.w mt_checkmoreefx
mt_setdma
if mt_level6=0
bsr.w mt_dmawait
move.w mt_dmacontemp(pc),d0
or.w #$8000,d0
move.w d0,$dff096
bsr.w mt_dmawait
lea $dff0a0,a5
lea mt_chan1temp(pc),a6
move.l 10(a6),(a5)
move.w 14(a6),4(a5)
move.l 58(a6),$10(a5)
move.w 62(a6),$14(a5)
move.l 106(a6),$20(a5)
move.w 110(a6),$24(a5)
move.l 154(a6),$30(a5)
move.w 158(a6),$34(a5)
else
lea $bfd000,a3
move.b #$7f,$d00(a3)
move.w #$2000,$dff09c
move.w #$a000,$dff09a
lea mt_irq1(pc),a4
move.l a4,$78.w
moveq #0,d0
move.b d0,$e00(a3)
move.b #$a8,$400(a3)
move.b d0,$500(a3)
move.b #$11,$e00(a3)
move.b #$81,$d00(a3)
or.w #$8000,mt_dmacontemp-mt_pm(a2)
bra.w mt_dskip
mt_irq1
tst.b $bfdd00
move.w mt_dmacontemp(pc),$dff096
move.w #$2000,$dff09c
move.l mt_irqpointer(pc),$78.w
rte
mt_irqpointer dc.l mt_irq2-mt_init
mt_irq2
tst.b $bfdd00
movem.l a5-a6,-(a7)
lea $dff0a0,a5
lea mt_chan1temp(pc),a6
move.l 10(a6),(a5)
move.w 14(a6),4(a5)
move.l 58(a6),$10(a5)
move.w 62(a6),$14(a5)
move.l 106(a6),$20(a5)
move.w 110(a6),$24(a5)
move.l 154(a6),$30(a5)
move.w 158(a6),$34(a5)
clr.b $bfde00
move.b #$7f,$bfdd00
move.w #$2000,$dff09c
movem.l (a7)+,a5-a6
rte
endc
mt_dskip
add.w #16,mt_patternpos-mt_pm(a2)
move.b mt_pattdeltime(pc),d0
beq.b mt_dskc
move.b d0,mt_pattdeltime2-mt_pm(a2)
clr.b mt_pattdeltime-mt_pm(a2)
mt_dskc tst.b mt_pattdeltime2-mt_pm(a2)
beq.b mt_dska
subq.b #1,mt_pattdeltime2-mt_pm(a2)
beq.b mt_dska
sub.w #16,mt_patternpos-mt_pm(a2)
mt_dska tst.b mt_pbreakflag-mt_pm(a2)
beq.b mt_nnpysk
sf mt_pbreakflag-mt_pm(a2)
moveq #0,d0
move.b mt_pbreakpos(pc),d0
clr.b mt_pbreakpos-mt_pm(a2)
lsl.w #4,d0
move.w d0,mt_patternpos-mt_pm(a2)
mt_nnpysk
cmp.w #1024,mt_patternpos-mt_pm(a2)
blo.b mt_nonewposyet
mt_nextposition
moveq #0,d0
move.b mt_pbreakpos(pc),d0
lsl.w #4,d0
move.w d0,mt_patternpos-mt_pm(a2)
clr.b mt_pbreakpos-mt_pm(a2)
clr.b mt_posjumpflag-mt_pm(a2)
addq.w #4,mt_songpos-mt_pm(a2)
and.w #511,mt_songpos-mt_pm(a2)
move.w mt_songpos(pc),d1
move.l mt_dataptr(pc),a0
cmp.w 248(a0),d1
blo.b mt_nonewposyet
clr.w mt_songpos-mt_pm(a2)
mt_nonewposyet
tst.b mt_posjumpflag-mt_pm(a2)
bne.b mt_nextposition
rts
mt_checkefx
bsr.w mt_updatefunk
move.w 2(a6),d0
and.w #$0fff,d0
beq.b mt_pernop
moveq #0,d0
move.b 2(a6),d0
and.b d5,d0
move.w d0,d2
lsl.b #2,d2
move.l mt_jumptab1(pc,d2.w),a4
jmp (a4)
mt_jumptab1
dc.l mt_arpeggio-mt_init,mt_portaup-mt_init,mt_portadown-mt_init
dc.l mt_toneportamento-mt_init
dc.l mt_vibrato-mt_init,mt_toneplusvolslide-mt_init
dc.l mt_vibratoplusvolslide-mt_init
dcb.l 7,mt_setback-mt_init
dc.l mt_e_commands-mt_init,mt_setback-mt_init
mt_setback
move.w 16(a6),6(a5)
subq.b #7,d0
beq.w mt_tremolo
subq.b #3,d0
beq.w mt_volumeslide
mt_return2
rts
mt_pernop
move.w 16(a6),6(a5)
rts
mt_arpeggio
moveq #0,d0
move.b mt_counter(pc),d0
moveq #3,d2
divs d2,d0
swap d0
tst.w d0
beq.b mt_arpeggio2
subq.w #2,d0
beq.b mt_arpeggio1
moveq #0,d0
move.b 3(a6),d0
lsr.b #4,d0
bra.b mt_arpeggio3
mt_arpeggio1
moveq #0,d0
move.b 3(a6),d0
and.b d5,d0
bra.b mt_arpeggio3
mt_arpeggio2
move.w 16(a6),d2
bra.b mt_arpeggio4
mt_arpeggio3
add.w d0,d0
move.l 44(a6),a0
moveq #36,d7
mt_arploop
move.w (a0,d0.w),d2
cmp.w (a0),d1
bhs.b mt_arpeggio4
addq.l #2,a0
dbf d7,mt_arploop
rts
mt_arpeggio4
move.w d2,6(a5)
rts
mt_fineportaup
tst.b mt_counter-mt_pm(a2)
bne.b mt_return2
move.b d1,mt_lowmask-mt_pm(a2)
mt_portaup
moveq #0,d0
move.b 3(a6),d0
and.b mt_lowmask(pc),d0
move.b #$ff,mt_lowmask-mt_pm(a2)
sub.w d0,16(a6)
move.w 16(a6),d0
and.w #$0fff,d0
cmp.w #113,d0
bhi.b mt_portauskip
and.w #$f000,16(a6)
or.w #113,16(a6)
mt_portauskip
move.w 16(a6),d0
and.w #$0fff,d0
move.w d0,6(a5)
rts
mt_fineportadown
tst.b mt_counter-mt_pm(a2)
bne.w mt_return2
move.b d5,mt_lowmask-mt_pm(a2)
mt_portadown
moveq #0,d0
move.b 3(a6),d0
and.b mt_lowmask(pc),d0
move.b #$ff,mt_lowmask-mt_pm(a2)
add.w d0,16(a6)
move.w 16(a6),d0
and.w #$0fff,d0
cmp.w #856,d0
blo.b mt_portadskip
and.w #$f000,16(a6)
or.w #856,16(a6)
mt_portadskip
move.w 16(a6),d0
and.w #$0fff,d0
move.w d0,6(a5)
rts
mt_settoneporta
move.w (a6),d2
and.w #$0fff,d2
move.l 44(a6),a4
moveq #0,d0
mt_stploop
cmp.w (a4,d0.w),d2
bhs.b mt_stpfound
addq.w #2,d0
cmp.w #37*2,d0
blo.b mt_stploop
moveq #35*2,d0
mt_stpfound
move.b 18(a6),d2
and.b #8,d2
beq.b mt_stpgoss
tst.w d0
beq.b mt_stpgoss
subq.w #2,d0
mt_stpgoss
move.w (a4,d0.w),d2
move.w d2,24(a6)
move.w 16(a6),d0
clr.b 22(a6)
cmp.w d0,d2
beq.b mt_cleartoneporta
bge.w mt_return2
move.b #1,22(a6)
rts
mt_cleartoneporta
clr.w 24(a6)
rts
mt_toneportamento
move.b 3(a6),d0
beq.b mt_toneportnochange
move.b d0,23(a6)
clr.b 3(a6)
mt_toneportnochange
tst.w 24(a6)
beq.w mt_return2
moveq #0,d0
move.b 23(a6),d0
tst.b 22(a6)
bne.b mt_toneportaup
mt_toneportadown
add.w d0,16(a6)
move.w 24(a6),d0
cmp.w 16(a6),d0
bgt.b mt_toneportasetper
move.w 24(a6),16(a6)
clr.w 24(a6)
bra.b mt_toneportasetper
mt_toneportaup
sub.w d0,16(a6)
move.w 24(a6),d0
cmp.w 16(a6),d0
blt.b mt_toneportasetper
move.w 24(a6),16(a6)
clr.w 24(a6)
mt_toneportasetper
move.w 16(a6),d2
move.b 31(a6),d0
and.b d5,d0
beq.b mt_glissskip
move.l 44(a6),a0
moveq #35,d7
mt_glissloop
cmp.w (a0)+,d2
bge.b mt_glissfound
dbf d7,mt_glissloop
subq.l #2,a0
mt_glissfound
move.w -2(a0),d2
mt_glissskip
move.w d2,6(a5) ; set period
rts
mt_vibrato
move.b 3(a6),d0
beq.b mt_vibrato2
move.b 26(a6),d2
and.b d5,d0
beq.b mt_vibskip
and.b d6,d2
or.b d0,d2
mt_vibskip
move.b 3(a6),d0
and.b d6,d0
beq.b mt_vibskip2
and.b d5,d2
or.b d0,d2
mt_vibskip2
move.b d2,26(a6)
mt_vibrato2
move.b 27(a6),d0
lea mt_vibratotable(pc),a4
lsr.w #2,d0
and.w #$001f,d0
moveq #0,d2
move.b 30(a6),d2
and.b #$03,d2
beq.b mt_vib_sine
lsl.b #3,d0
cmp.b #1,d2
beq.b mt_vib_rampdown
moveq #-1,d2
bra.b mt_vib_set
mt_vib_rampdown
tst.b 27(a6)
bpl.b mt_vib_rampdown2
moveq #-1,d2
sub.b d0,d2
bra.b mt_vib_set
mt_vib_rampdown2
move.b d0,d2
bra.b mt_vib_set
mt_vib_sine
move.b (a4,d0.w),d2
mt_vib_set
move.b 26(a6),d0
and.w d5,d0
mulu d0,d2
lsr.w #7,d2
move.w 16(a6),d0
tst.b 27(a6)
bmi.b mt_vibratoneg
add.w d2,d0
bra.b mt_vibrato3
mt_vibratoneg
sub.w d2,d0
mt_vibrato3
move.w d0,6(a5)
move.b 26(a6),d0
lsr.w #2,d0
and.w #$003c,d0
add.b d0,27(a6)
rts
mt_toneplusvolslide
bsr.w mt_toneportnochange
bra.w mt_volumeslide
mt_vibratoplusvolslide
bsr.b mt_vibrato2
bra.w mt_volumeslide
mt_tremolo
move.b 3(a6),d0
beq.b mt_tremolo2
move.b 28(a6),d2
and.b d5,d0
beq.b mt_treskip
and.b d6,d2
or.b d0,d2
mt_treskip
move.b 3(a6),d0
and.b d6,d0
beq.b mt_treskip2
and.b d5,d2
or.b d0,d2
mt_treskip2
move.b d2,28(a6)
mt_tremolo2
move.b 29(a6),d0
lea mt_vibratotable(pc),a4
lsr.w #2,d0
moveq #$1f,d2
and.w d2,d0
move.b 30(a6),d2
and.w d6,d2
lsr.b #4,d2
and.b #$03,d2
beq.b mt_tre_sine
lsl.b #3,d0
cmp.b #1,d2
beq.b mt_tre_rampdown
moveq #-1,d2
bra.b mt_tre_set
mt_tre_rampdown
tst.b 27(a6)
bpl.b mt_tre_rampdown2
moveq #-1,d2
sub.b d0,d2
bra.b mt_tre_set
mt_tre_rampdown2
move.b d0,d2
bra.b mt_tre_set
mt_tre_sine
move.b (a4,d0.w),d2
mt_tre_set
move.b 28(a6),d0
and.w d5,d0
mulu d0,d2
lsr.w #6,d2
moveq #0,d0
move.b 19(a6),d0
tst.b 29(a6)
bmi.b mt_tremoloneg
add.w d2,d0
bra.b mt_tremolo3
mt_tremoloneg
sub.w d2,d0
mt_tremolo3
bpl.b mt_tremoloskip
moveq #0,d0
mt_tremoloskip
cmp.b mt_maxvol(pc),d0
bls.b mt_tremolook
move.b mt_maxvol(pc),d0
mt_tremolook
move.b d0,9(a5)
move.b 28(a6),d0
lsr.w #2,d0
and.w #$003c,d0
add.b d0,29(a6)
rts
mt_sampleoffset
moveq #0,d0
move.b 3(a6),d0
beq.b mt_sononew
move.b d0,32(a6)
mt_sononew
move.b 32(a6),d0
lsl.w #7,d0
cmp.w 8(a6),d0
bge.b mt_sofskip
sub.w d0,8(a6)
add.w d0,d0
add.l d0,4(a6)
rts
mt_sofskip
move.w #1,8(a6)
rts
mt_volumeslide
move.b 3(a6),d0
lsr.b #4,d0
beq.b mt_volslidedown
mt_volslideup
add.b d0,19(a6)
move.b mt_maxvol(pc),d2
cmp.b 19(a6),d2
bge.b mt_vsuskip
move.b d2,19(a6)
mt_vsuskip
move.b 19(a6),9(a5)
rts
mt_volslidedown
move.b 3(a6),d0
and.b d5,d0
mt_volslidedown2
sub.b d0,19(a6)
bpl.b mt_vsdskip
clr.b 19(a6)
mt_vsdskip
move.b 19(a6),9(a5)
rts
mt_positionjump
moveq #0,d0
move.b 3(a6),d0
subq.b #1,d0
lsl.w #2,d0
move.w d0,mt_songpos-mt_pm(a2)
mt_pj2 clr.b mt_pbreakpos-mt_pm(a2)
st mt_posjumpflag-mt_pm(a2)
rts
mt_volumechange
move.b 3(a6),d0
cmp.b mt_maxvol(pc),d0
ble.b mt_volumeok
move.b mt_maxvol(pc),d0
mt_volumeok
move.b d0,19(a6)
move.b d0,9(a5)
rts
mt_patternbreak
move.b 3(a6),d0
move.b d0,d2
lsr.b #4,d0
move.b d0,d1
add.b d0,d0 ;*2
lsl.b #3,d1 ;*8
add.b d1,d0 ;+ -> *10
and.b d5,d2
add.b d2,d0
cmp.b #63,d0
bhi.b mt_pj2
move.b d0,mt_pbreakpos-mt_pm(a2)
st mt_posjumpflag-mt_pm(a2)
rts
mt_setspeed
move.b 3(a6),d0
beq.w mt_return2
clr.b mt_counter-mt_pm(a2)
move.b d0,mt_speed-mt_pm(a2)
rts
mt_checkmoreefx
bsr.w mt_updatefunk
moveq #0,d0
move.b 2(a6),d0
and.b d5,d0
lsl.b #2,d0
move.l mt_jumptab4(pc,d0.w),a4
jmp (a4)
mt_jumptab4
dcb.l 9,mt_pernop-mt_init
dc.l mt_sampleoffset-mt_init,mt_pernop-mt_init
dc.l mt_positionjump-mt_init
dc.l mt_volumechange-mt_init,mt_patternbreak-mt_init
dc.l mt_e_commands-mt_init,mt_setspeed-mt_init,mt_pernop-mt_init
mt_e_commands
moveq #0,d0
move.b 3(a6),d0
lsr.b #4,d0
lsl.b #2,d0
move.l mt_jumptab2(pc,d0.w),a4
jmp (a4)
mt_jumptab2
dc.l mt_filteronoff-mt_init,mt_fineportaup-mt_init
dc.l mt_fineportadown-mt_init
dc.l mt_setglisscontrol-mt_init,mt_setvibratocontrol-mt_init
dc.l mt_setfinetune-mt_init
dc.l mt_jumploop-mt_init,mt_settremolocontrol-mt_init
dc.l mt_return2-mt_init,mt_retrignote-mt_init
dc.l mt_volumefineup-mt_init
dc.l mt_volumefinedown-mt_init,mt_notecut-mt_init
dc.l mt_notedelay-mt_init
dc.l mt_patterndelay-mt_init,mt_funkit-mt_init
mt_filteronoff
move.b 3(a6),d0
and.b #1,d0
add.w d0,d0
and.b #$fd,$bfe001
or.b d0,$bfe001
rts
mt_setglisscontrol
move.b 3(a6),d0
and.b d5,d0
and.b d6,31(a6)
or.b d0,31(a6)
rts
mt_setvibratocontrol
move.b 3(a6),d0
and.b d5,d0
and.b d6,30(a6)
or.b d0,30(a6)
rts
mt_setfinetune
moveq #0,d0
move.b 3(a6),d0
and.b d5,d0
move.b d0,18(a6)
add.w d0,d0
move.w (a2,d0.w),d0
lea mt_periodtable(pc),a4
add.l d0,a4
move.l a4,44(a6)
rts
mt_jumploop
move.b mt_counter(pc),d1
bne.w mt_return2
move.b 3(a6),d0
and.b d5,d0
beq.b mt_setloop
tst.b 34(a6)
beq.b mt_jumpcnt
subq.b #1,34(a6)
beq.w mt_return2
mt_jmploop
move.b 33(a6),mt_pbreakpos-mt_pm(a2)
st mt_pbreakflag-mt_pm(a2)
rts
mt_jumpcnt
move.b d0,34(a6)
bra.b mt_jmploop
mt_setloop
move.w mt_patternpos(pc),d0
lsr.w #4,d0
move.b d0,33(a6)
rts
mt_settremolocontrol
move.b 3(a6),d0
and.b d5,d0
lsl.b #4,d0
and.b d5,30(a6)
or.b d0,30(a6)
rts
mt_retrignote
move.b 3(a6),d0
and.b d5,d0
beq.b mt_rtnend
moveq #0,d2
move.b mt_counter(pc),d2
bne.b mt_rtnskp
move.w (a6),d2
and.w #$0fff,d2
bne.b mt_rtnend
moveq #0,d2
move.b mt_counter(pc),d2
mt_rtnskp
divu d0,d2
swap d2
tst.w d2
bne.b mt_rtnend
mt_doretrig
move.w 20(a6),$dff096 ; channel dma off
move.l 4(a6),(a5) ; set sampledata pointer
move.w 8(a6),4(a5) ; set length
bsr.w mt_dmawait
move.w 20(a6),d0
or.w #$8000,d0
move.w d0,$dff096
bsr.w mt_dmawait
move.l 10(a6),(a5)
move.l 14(a6),4(a5)
mt_rtnend
rts
mt_volumefineup
move.b mt_counter(pc),d1
bne.w mt_return2
move.b 3(a6),d0
and.b d5,d0
bra.w mt_volslideup
mt_volumefinedown
move.b mt_counter(pc),d1
bne.w mt_return2
move.b 3(a6),d0
and.b d5,d0
bra.w mt_volslidedown2
mt_notecut
cmp.b mt_counter(pc),d0
bne.w mt_return2
clr.b 19(a6)
clr.w 8(a5)
rts
mt_notedelay
move.b 3(a6),d0
and.b d5,d0
cmp.b mt_counter(pc),d0
bne.w mt_return2
move.w (a6),d0
beq.w mt_return2
bra.b mt_doretrig
mt_patterndelay
move.b mt_counter(pc),d1
bne.w mt_return2
move.b mt_pattdeltime2(pc),d1
bne.w mt_return2
move.b 3(a6),d0
and.b d5,d0
addq.b #1,d0
move.b d0,mt_pattdeltime-mt_pm(a2)
rts
mt_funkit
move.b mt_counter(pc),d1
bne.w mt_return2
move.b 3(a6),d0
and.b d5,d0
lsl.b #4,d0
and.b d5,31(a6)
or.b d0,31(a6)
tst.b d0
beq.w mt_return2
mt_updatefunk
moveq #0,d0
move.b 31(a6),d0
lsr.b #4,d0
beq.b mt_funkend
lea mt_funktable(pc),a4
move.b (a4,d0.w),d0
add.b d0,35(a6)
btst #7,35(a6)
beq.b mt_funkend
clr.b 35(a6)
move.l 10(a6),d0
moveq #0,d2
move.w 14(a6),d2
add.w d2,d2
add.l d2,d0
move.l 36(a6),a4
addq.l #1,a4
cmp.l d0,a4
blo.b mt_funkok
move.l 10(a6),a4
mt_funkok
move.l a4,36(a6)
moveq #-1,d0
sub.b (a4),d0
move.b d0,(a4)
mt_funkend
rts
mt_dmawait
if mt_dmawaiter>0
moveq #mt_dmawaiter-1,d4
mt_waitdma2
move.b $dff006,d3
mt_waitdma3
cmp.b $dff006,d3
beq.b mt_waitdma3
dbf d4,mt_waitdma2 ;wait some rasters
endc
rts
mt_funktable dc.b 0,5,6,7,8,10,11,13,16,19,22,26,32,43,64,128
mt_vibratotable dc.b 0, 24, 49, 74, 97,120,141,161
dc.b 180,197,212,224,235,244,250,253
dc.b 255,253,250,244,235,224,212,197
dc.b 180,161,141,120, 97, 74, 49, 24
mt_periodtable dc.w 856,808,762,720,678,640,604,570,538,508,480,453
dc.w 428,404,381,360,339,320,302,285,269,254,240,226
dc.w 214,202,190,180,170,160,151,143,135,127,120,113 ;0
dc.w 850,802,757,715,674,637,601,567,535,505,477,450
dc.w 425,401,379,357,337,318,300,284,268,253,239,225
dc.w 213,201,189,179,169,159,150,142,134,126,119,113 ;1
dc.w 844,796,752,709,670,632,597,563,532,502,474,447
dc.w 422,398,376,355,335,316,298,282,266,251,237,224
dc.w 211,199,188,177,167,158,149,141,133,125,118,112 ;2
dc.w 838,791,746,704,665,628,592,559,528,498,470,444
dc.w 419,395,373,352,332,314,296,280,264,249,235,222
dc.w 209,198,187,176,166,157,148,140,132,125,118,111 ;3
dc.w 832,785,741,699,660,623,588,555,524,495,467,441
dc.w 416,392,370,350,330,312,294,278,262,247,233,220
dc.w 208,196,185,175,165,156,147,139,131,124,117,110 ;4
dc.w 826,779,736,694,655,619,584,551,520,491,463,437
dc.w 413,390,368,347,328,309,292,276,260,245,232,219
dc.w 206,195,184,174,164,155,146,138,130,123,116,109 ;5
dc.w 820,774,730,689,651,614,580,547,516,487,460,434
dc.w 410,387,365,345,325,307,290,274,258,244,230,217
dc.w 205,193,183,172,163,154,145,137,129,122,115,109 ;6
dc.w 814,768,725,684,646,610,575,543,513,484,457,431
dc.w 407,384,363,342,323,305,288,272,256,242,228,216
dc.w 204,192,181,171,161,152,144,136,128,121,114,108 ;7
dc.w 907,856,808,762,720,678,640,604,570,538,508,480
dc.w 453,428,404,381,360,339,320,302,285,269,254,240
dc.w 226,214,202,190,180,170,160,151,143,135,127,120 ;-8
dc.w 900,850,802,757,715,675,636,601,567,535,505,477
dc.w 450,425,401,379,357,337,318,300,284,268,253,238
dc.w 225,212,200,189,179,169,159,150,142,134,126,119 ;-7
dc.w 894,844,796,752,709,670,632,597,563,532,502,474
dc.w 447,422,398,376,355,335,316,298,282,266,251,237
dc.w 223,211,199,188,177,167,158,149,141,133,125,118 ;-6
dc.w 887,838,791,746,704,665,628,592,559,528,498,470
dc.w 444,419,395,373,352,332,314,296,280,264,249,235
dc.w 222,209,198,187,176,166,157,148,140,132,125,118 ;-5
dc.w 881,832,785,741,699,660,623,588,555,524,494,467
dc.w 441,416,392,370,350,330,312,294,278,262,247,233
dc.w 220,208,196,185,175,165,156,147,139,131,123,117 ;-4
dc.w 875,826,779,736,694,655,619,584,551,520,491,463
dc.w 437,413,390,368,347,328,309,292,276,260,245,232
dc.w 219,206,195,184,174,164,155,146,138,130,123,116 ;-3
dc.w 868,820,774,730,689,651,614,580,547,516,487,460
dc.w 434,410,387,365,345,325,307,290,274,258,244,230
dc.w 217,205,193,183,172,163,154,145,137,129,122,115 ;-2
dc.w 862,814,768,725,684,646,610,575,543,513,484,457
dc.w 431,407,384,363,342,323,305,288,272,256,242,228
dc.w 216,203,192,181,171,161,152,144,136,128,121,114 ;-1
mt_chan1temp dc.l 0,0,0,0,0,$00010000,0, 0,0,0,0, 0
mt_chan2temp dc.l 0,0,0,0,0,$00020000,0, 0,0,0,0, 0
mt_chan3temp dc.l 0,0,0,0,0,$00040000,0, 0,0,0,0, 0
mt_chan4temp dc.l 0,0,0,0,0,$00080000,0, 0,0,0,0, 0
mt_samplestarts dcb.l 31
mt_speed dc.b 6
mt_counter dc.b 0
mt_songpos dc.w 0
mt_pbreakpos dc.b 0
mt_posjumpflag dc.b 0
mt_pbreakflag dc.b 0
mt_lowmask dc.b 0
mt_pattdeltime dc.b 0
mt_pattdeltime2 dc.b 0
mt_maxvol dc.b 64 ;maximum volume
dc.b 0 ;unsed
mt_patternpos dc.w 0
mt_dmacontemp dc.w 0
mt_oldirq dc.l 0
mt_pm dcb.w 16
mt_dataptr dc.l mt_data ;pointer auf sound
section "sound",data_c
incdir df0:
mt_data incbin mod.testmodul.pm